package com.kanshu.basictest.widget.adapter.recycler;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

/**
 * 需要注意的是,getItemOffsets是针对每个Item都会走一次，也就是说每个Item的outRect都可以不同，但是onDraw和onDrawOver所整个ItemDecoration只执行一次的，
 * 并不是针对Item的，所以我们需要在onDraw和onDrawOver中绘图时，一次性将所有Item的ItemDecoration绘制完成。
 * 从上面也可以看出，这里在onDraw函数中绘图时，通过for循环对每一个item画上一个绿色圆。
 */
public class LinearItemDecoration extends RecyclerView.ItemDecoration {

    private static final String TAG = "LinearItemDecoration";
    private Paint mPaint;

    private int time = 0;

    public LinearItemDecoration() {
        mPaint = new Paint();
    }

    /**
     * @param outRect 这个是最难理解的部分，outRect就是表示在item的上下左右所撑开的距离，后面详细讲解。
     * @param view    是指当前Item的View对象
     * @param parent  是指RecyclerView本身
     * @param state   通过State可以获取当前RecyclerView的状态，也可以通过State在RecyclerView各组件间传递参数
     */
    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        Log.i(TAG, "getItemOffsets: 第" + (++time) + "次执行");
        outRect.bottom = 50; //单位是px

        Log.i(TAG, "getItemOffsets: parent.getChildAdapterPosition:" + parent.getChildAdapterPosition(view));
        Log.i(TAG, "getItemOffsets: parent.getChildViewHolder(view).getAdapterPosition():" + parent.getChildViewHolder(view).getAdapterPosition());

        //int type = parent.getAdapter().getItemViewType(parent.getChildAdapterPosition(view));
        int type = parent.getLayoutManager().getItemViewType(view);

        if (type == 0) {
            outRect.left = 200;
        } else {
            outRect.left = 100;
        }

    }


    /**
     * @param c      是指通过getItemOffsets撑开的空白区域所对应的画布，通过这个canvas对象，可以在getItemOffsets所撑出来的区域任意绘图。
     * @param parent 是指RecyclerView本身
     * @param state  通过State可以获取当前RecyclerView的状态，也可以通过State在RecyclerView各组件间传递参数
     */
    @Override
    public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDraw(c, parent, state);

        int count = parent.getChildCount();

        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        for (int i = 0; i < count; i++) {
            View child = parent.getChildAt(i);
            //圆心坐标
            int left = layoutManager.getLeftDecorationWidth(child);
            int cx = left / 2;
            int cy = child.getTop() + child.getHeight() / 2;
            mPaint.setColor(Color.GREEN);
            c.drawCircle(cx, cy, 20, mPaint);
        }
    }

    /**
     * @param c      是指通过getItemOffsets撑开的空白区域所对应的画布，通过这个canvas对象，可以在getItemOffsets所撑出来的区域任意绘图。
     * @param parent 是指RecyclerView本身
     * @param state  通过State可以获取当前RecyclerView的状态，也可以通过State在RecyclerView各组件间传递参数
     */
    @Override
    public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
    }
}
